Android ANR和OOM


ANR出现

如果开发机器上出现问题,我们可以通过查看/data/anr/traces.txt即可,最新的ANR信息在最开始部分。

  1. 主线程被IO操作(从4.0之后网络IO不允许在主线程中)阻塞。
  2. 主线程中存在耗时的计算
  3. 主线程中错误的操作,比如Thread.wait或者Thread.sleep等,Android系统会监控程序的响应状况,一旦出现下面两种情况,则弹出ANR对话框
  4. 应用在5秒内未响应用户的输入事件(如按键或者触摸)
  5. BroadcastReceiver未在10秒内完成相关的处理
  6. Service在特定的时间内无法处理完成 20秒
  7. 使用AsyncTask处理耗时IO操作。
  8. 使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同。
  9. 使用Handler处理工作线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程。
  10. Activity的onCreate和onResume回调中尽量避免耗时的代码
  11. BroadcastReceiver中onReceive代码也要尽量减少耗时,建议使用IntentService处理。

避免出现OOM

  1. 使用更加轻量的数据结构
  2. Android里面使用Enum
  3. Bitmap对象的内存占用
  4. 更大的图片
  5. onDraw方法里面执行对象的创建
  6. StringBuilder